package com.kk.demo.mesi;

import java.util.HashMap;
import java.util.Map;
import java.util.Queue;

import com.kk.demo.mesi.impl.ExclusiveStateImpl;
import com.kk.demo.mesi.impl.InvalidStateImpl;
import com.kk.demo.mesi.impl.ModifiedStateImpl;
import com.kk.demo.mesi.impl.SharedStateImpl;

/**
 * 数据的上下对象,用来记录数据的各种状态 m
* 源文件名：MesiStateContext.java
* 文件版本：1.0.0
* 创建作者：liujun
* 创建日期：2016年9月21日
* 修改作者：liujun
* 修改日期：2016年9月21日
* 文件描述：liujun
* 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
*/
public class MesiStateContext {

    /**
     * 获取队列信息
    * @字段说明 takeQueue
    */
    private Queue<MesiState> takeQueue;

    /**
     * 放入的队列信息
    * @字段说明 pullQueue
    */
    private Queue<MesiState> pullQueue;

    /**
     * 上下文对象信息
    * @字段说明 MESICONTEXT
    */
    private static final MesiStateContext MESICONTEXT = new MesiStateContext();

    /**
     * 当前这行数据有效，数据和远程的数据一致，数据只存在于本Cache中。
    * @字段说明 exclusive
    */
    private static final MesiStateServiceInf EXCLUSIVE = new ExclusiveStateImpl(MESICONTEXT);

    /**
     * 这行数据有效，数据和远程中的数据一致，数据存在于很多Cache中。
    * @字段说明 shared
    */
    private static final MesiStateServiceInf SHARD = new SharedStateImpl(MESICONTEXT);

    /**
     * 这行数据有效，数据被修改了，和远程中的数据不一致，数据只存在于本Cache中。
    * @字段说明 modified
    */
    private static final MesiStateServiceInf MODIFIED = new ModifiedStateImpl(MESICONTEXT);

    /**
     * 这行数据无效。
    * @字段说明 invalid
    */
    private static final MesiStateServiceInf INVALID = new InvalidStateImpl(MESICONTEXT);

    /**
     * 当前数据的状态
    * @字段说明 currState
    */
    private MesiStateServiceInf currState;

    /**
     * mesi协议状态信息
    * 源文件名：MesiStateContext.java
    * 文件版本：1.0.0
    * 创建作者：liujun
    * 创建日期：2016年9月22日
    * 修改作者：liujun
    * 修改日期：2016年9月22日
    * 文件描述：liujun
    * 版权所有：Copyright 2016 zjhz, Inc. All Rights Reserved.
    */
    public enum MesiState {

        /**
         * 当前这行数据有效，数据和远程的数据一致，数据只存在于本Cache中。
        * @字段说明 EXCLUSIVE_STATE
        */
        EXCLUSIVE_STATE(EXCLUSIVE),

        /**
         * 修改状态
        * @字段说明 MODIFIED_STATE
        */
        MODIFIED_STATE(MODIFIED),

        /**
         * 无效状态
        * @字段说明 INVALID_STATE
        */
        INVALID_STATE(INVALID),

        /**
         * 共享状态
        * @字段说明 SHARD_STATE
        */
        SHARD_STATE(SHARD);

        private MesiStateServiceInf state;

        private MesiState(MesiStateServiceInf state) {
            this.state = state;
        }

        public MesiStateServiceInf getState() {
            return state;
        }

        public void setState(MesiStateServiceInf state) {
            this.state = state;
        }
    }

    private Queue queue;

    /**
     * 本地缓存的数据
    * @字段说明 map
    */
    private Map<String, Object> localCache = new HashMap<>();

    /**
     * 数据的远程操作
    * @字段说明 remoteOper
    */
    private RemoteOperator remoteOper;

    /**
     * 获得本地缓存的数据
    * 方法描述
    * @param key
    * @return
    * @创建日期 2016年9月21日
    */
    public Object getLocalCache(String key) {
        return this.localCache.get(key);
    }

    /**
     * 添加本地缓存数据
    * 方法描述
    * @param key
    * @param value
    * @创建日期 2016年9月21日
    */
    public void addLocalCache(String key, Object value) {
        this.localCache.put(key, value);
    }

    public RemoteOperator getRemoteOper() {
        return remoteOper;
    }

    public void setRemoteOper(RemoteOperator remoteOper) {
        this.remoteOper = remoteOper;
    }

    public MesiStateServiceInf getCurrState() {
        return currState;
    }

    public void setCurrState(MesiStateServiceInf currState) {
        this.currState = currState;
    }

    /**
     * 进行本地cache的数据的读取
     */
    public Object loadRead(String key) {
        return this.currState.loadRead(key);
    }

    /**
     * 进行本地cache的数据的写入
    * 方法描述
    * @param key
    * @param value
    * @创建日期 2016年9月21日
    */
    public void localWrite(String key, Object value) {
        this.currState.localWrite(key, value);
    }

}
